#ifdef M_SPI_SUPPORT_HI3861

#include "m_spi.h"
#include "m_log.h"

#include "hi_gpio.h"
#include "hi_spi.h"
#include "hi_time.h"
#include "hi_io.h"

static hi_spi_idx g_spiId = HI_SPI_ID_0;

static void spi_config_gpio(hi_spi_idx id)
{
    if (id == HI_SPI_ID_0) {
        hi_gpio_set_dir(HI_GPIO_IDX_5, HI_GPIO_DIR_OUT);
        hi_gpio_set_dir(HI_GPIO_IDX_6, HI_GPIO_DIR_OUT);
        hi_gpio_set_dir(HI_GPIO_IDX_7, HI_GPIO_DIR_IN);
        hi_gpio_set_dir(HI_GPIO_IDX_8, HI_GPIO_DIR_OUT);
        hi_io_set_func(HI_IO_NAME_GPIO_5, HI_IO_FUNC_GPIO_5_SPI0_CSN);
        hi_io_set_func(HI_IO_NAME_GPIO_6, HI_IO_FUNC_GPIO_6_SPI0_CK);
        hi_io_set_func(HI_IO_NAME_GPIO_7, HI_IO_FUNC_GPIO_7_SPI0_RXD);
        hi_io_set_func(HI_IO_NAME_GPIO_8, HI_IO_FUNC_GPIO_8_SPI0_TXD);
        hi_io_set_driver_strength(HI_IO_NAME_GPIO_6, HI_IO_DRIVER_STRENGTH_0);
    } else {
        hi_io_set_func(HI_IO_NAME_GPIO_0, HI_IO_FUNC_GPIO_0_SPI1_CK);
        hi_io_set_func(HI_IO_NAME_GPIO_1, HI_IO_FUNC_GPIO_1_SPI1_RXD);
        hi_io_set_func(HI_IO_NAME_GPIO_2, HI_IO_FUNC_GPIO_2_SPI1_TXD);
        hi_io_set_func(HI_IO_NAME_GPIO_3, HI_IO_FUNC_GPIO_3_SPI1_CSN);
        hi_io_set_driver_strength(HI_IO_NAME_GPIO_0, HI_IO_DRIVER_STRENGTH_2);
    }
}

int m_spi_init()
{
    hi_spi_cfg_init_param param;
    param.is_slave = HI_FALSE;

    hi_spi_cfg_basic_info info;
    info.cpol = HI_SPI_CFG_CLOCK_CPOL_0;
    info.cpha = HI_SPI_CFG_CLOCK_CPHA_0;
    info.fram_mode = HI_SPI_CFG_FRAM_MODE_MOTOROLA;
    info.data_width = HI_SPI_CFG_DATA_WIDTH_E_8BIT;
    //info.endian = HI_SPI_CFG_ENDIAN_BIG;
    info.freq = 10000;

    int r = hi_spi_init(g_spiId, param, &info);
    if (r != 0) {
        m_log_e(M_SPI_H, "hi spi init fail: 0x%02x\n", r);
        return r;
    }

    spi_config_gpio(g_spiId);

    r = hi_spi_set_loop_back_mode(g_spiId, HI_FALSE);
    if (r != 0) {
        m_log_e(M_SPI_H, "hi spi set loop back mode fail: 0x%02x\n", r);
        return r;
    }
    r = hi_spi_set_irq_mode(g_spiId, HI_FALSE);
    if (r != 0) {
        m_log_e(M_SPI_H, "hi spi set irq mode fail: 0x%02x\n", r);
        return r;
    }
    m_log_t(M_SPI_H, "hi spi init success\n");
    return 0;
}

int m_spi_host_write_read(m_spi_data *data)
{
    int r = hi_spi_host_writeread(g_spiId, data->sendBuf, data->recvBuf, data->recvSize);
    return r;
}

#endif // M_SPI_SUPPORT_HI3861
